package thread5.TEST;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class test6 {
}
// 直接交互
class DirectInteraction {
    private String sharedData;
    private boolean dataReady = false;
    private final Object lock = new Object();

    // 生产者
    public void produce(String data) {
        synchronized(lock) {
            while(dataReady) { // 必须知道消费者的状态，等待消费者取走数据
                try { lock.wait(); } catch (InterruptedException e) {}
            }
            sharedData = data;
            dataReady = true; // 必须设置消费者需要的状态
            lock.notify();    // 必须直接通知消费者
        }
    }

    // 消费者
    public String consume() {
        synchronized(lock) {
            while(!dataReady) { // 必须知道生产者的状态，等待生产者提供数据
                try { lock.wait(); } catch (InterruptedException e) {}
            }
            String result = sharedData;
            dataReady = false;  // 必须设置生产者需要的状态
            lock.notify();      // 必须直接通知生产者
            return result;
        }
    }
}

// 间接交互
class IndirectInteraction {
    private BlockingQueue<String> queue = new ArrayBlockingQueue<>(10); //已经在队列组件里 实现好了 生产消费的 锁同步与锁协调

    // 生产者
    public void produce(String data) {
        try {
            queue.put(data); // 生产者 只与共享的队列交互 调用队列里面的put方法即可，不关心消费者了
        } catch (InterruptedException e) {}
    }

    // 消费者
    public String consume() {
        try {
            return queue.take(); // 消费者 只与共享的队列交互 调用队列里面的take方法即可，不关心生产者了
        } catch (InterruptedException e) { return null; }
    }
}
